/*
 * InputForm.java
 *
 * Created on 13-Aug-2009, 14:44:25
 * Copyright me
 */
package portalTaverna;

import com.icesoft.faces.component.ext.HtmlDataTable;
import com.icesoft.faces.component.ext.HtmlOutputText;
import com.icesoft.faces.component.inputfile.InputFile;
import com.icesoft.faces.component.inputfile.FileInfo;
import java.util.*;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.util.Vector;
import javax.faces.FacesException;
import javax.faces.event.ActionEvent;
import javax.xml.parsers.*;
import javax.xml.xpath.*;
import org.w3c.dom.*;
import org.xml.sax.InputSource;
import tavernacon.RESTClient;

/**
 * <p>Page bean that corresponds to a similarly named JSP page.  This
 * class contains component definitions (and initialization code) for
 * all components that you have defined on this page, as well as
 * lifecycle methods and event handlers where you may add behavior
 * to respond to incoming events.</p>
 */
public class ServerWorkflows {

    static Vector inputsVector;
    static String[] filesInDir;
    public static WorkflowDetails[] workflows;
    InterfaceGenerator ig = new InterfaceGenerator();

    // <editor-fold defaultstate="collapsed" desc="Managed Component Definition">
    private int __placeholder;

    /**
     * <p>Automatically managed component initialization.  <strong>WARNING:</strong>
     * This method is automatically generated, so any user-specified code inserted
     * here is subject to being replaced.</p>
     */
    private void _init() throws Exception {
    }
    public static HtmlDataTable workflowsTable = new HtmlDataTable();

    public HtmlDataTable getWorkflowsTable() {
        return workflowsTable;
    }

    public void setWorkflowsTable(HtmlDataTable hdt) {
        this.workflowsTable = hdt;
    }
    public HtmlOutputText workflowId = new HtmlOutputText();

    public HtmlOutputText getWorkflowId() {
        return workflowId;
    }

    public void setWorkflowId(HtmlOutputText hot) {
        this.workflowId = hot;
    }
    public boolean workflowsVis = false;

    public boolean getWorkflowsVis() {
        return workflowsVis;
    }

    public void setWorkflowsVis(boolean wfb) {
        this.workflowsVis = wfb;
    }
    public boolean inputsVis = false;

    public boolean getInputsVis() {
        return inputsVis;
    }

    public void setInputsVis(boolean wfb) {
        this.inputsVis = wfb;
    }


    // </editor-fold>
    /**
     * <p>Construct a new Page bean instance.</p>
     */
    public ServerWorkflows() {
    }

    /**
     * <p>Callback method that is called whenever a page is navigated to,
     * either directly via a URL, or indirectly via page navigation.
     * Customize this method to acquire resources that will be needed
     * for event handlers and lifecycle methods, whether or not this
     * page is performing post back processing.</p>
     * 
     * <p>Note that, if the current request is a postback, the property
     * values of the components do <strong>not</strong> represent any
     * values submitted with this request.  Instead, they represent the
     * property values that were saved for this view when it was rendered.</p>
     */

    /**
     * <p>Callback method that is called after the component tree has been
     * restored, but before any event processing takes place.  This method
     * will <strong>only</strong> be called on a postback request that
     * is processing a form submit.  Customize this method to allocate
     * resources that will be required in your event handlers.</p>
     */
    public void preprocess() {
    }

    /**
     * <p>Callback method that is called just before rendering takes place.
     * This method will <strong>only</strong> be called for the page that
     * will actually be rendered (and not, for example, on a page that
     * handled a postback and then navigated to a different page).  Customize
     * this method to allocate resources that will be required for rendering
     * this page.</p>
     */
    public void prerender() {
    }

    /**
     * <p>Callback method that is called after rendering is completed for
     * this request, if <code>init()</code> was called (regardless of whether
     * or not this was the page that was actually rendered).  Customize this
     * method to release resources acquired in the <code>init()</code>,
     * <code>preprocess()</code>, or <code>prerender()</code> methods (or
     * acquired during execution of an event handler).</p>
     */
    public void destroy() {
    }

    public String showWorkflows() throws Exception {

        workflowsVis = true;

        DocumentBuilderFactory Factory = DocumentBuilderFactory.newInstance();
        Factory.setNamespaceAware(true);
        DocumentBuilder builder = Factory.newDocumentBuilder();
        Document doc = builder.parse("http://rpc212.cs.man.ac.uk:8081/taverna-server-0.2.1/rest/workflows");
        //creating an XPathFactory:
        XPathFactory factory = XPathFactory.newInstance();
        //using this factory to create an XPath object:
        XPath xpath = factory.newXPath();
        //XPath object created compiles the XPath expression for inputs:
        XPathExpression workflowIdExpr = xpath.compile("//workflow/id/text()");
        Object workflowIdResult = workflowIdExpr.evaluate(doc, XPathConstants.NODESET);
        NodeList workflowIdNodeList = (NodeList) workflowIdResult;

        XPathExpression dateAddedExpr = xpath.compile("//workflow/created/text()");
        Object dateAddedResult = dateAddedExpr.evaluate(doc, XPathConstants.NODESET);
        NodeList dateAddedNodeList = (NodeList) dateAddedResult;

        workflows = new WorkflowDetails[workflowIdNodeList.getLength()];

        for (int i = 0; i < workflowIdNodeList.getLength(); i++) {

            StringTokenizer st = new StringTokenizer(dateAddedNodeList.item(i).getNodeValue(), "T");
            String date = st.nextToken();
            String time = st.nextToken();
            time = time.substring(0, 5);

            WorkflowDetails workflow = new WorkflowDetails(workflowIdNodeList.item(i).getNodeValue(), date+" at "+time, "");

            workflows[i] = workflow;
        }

        workflowsTable.setValue(workflows);


        return null;
    }

    public String createInterface() throws Exception {


        ig.showPorts();


        return "server";
    }

    public String sp(){
        ig.showPorts();
        return null;
    }

    public void uploadFile(ActionEvent event) {

        try {
            RESTClient tavernaRESTClient = new RESTClient();
            tavernaRESTClient.setBaseURL("http://rpc212.cs.man.ac.uk:8081/taverna-server-0.2.1/rest");

            InputFile inputFile = (InputFile) event.getSource();
            FileInfo fileInfo = inputFile.getFileInfo();

            System.out.println("name: " + fileInfo.getFileName());
            //PushWorkflow.workflow = fileInfo.getFileName().substring(0, fileInfo.getFileName().lastIndexOf("."));

            System.out.println(inputFile.getFile());

            // Open the file that is the first
            // command line parameter
            FileInputStream fstream = new FileInputStream(inputFile.getFile());
            // Get the object of DataInputStream
            DataInputStream in = new DataInputStream(fstream);
            BufferedReader br = new BufferedReader(new InputStreamReader(in));
            String strLine;
            String workflowXml = "";
            //Read File Line By Line
            while ((strLine = br.readLine()) != null) {
                // Print the content on the console
                //System.out.println(strLine);
                workflowXml += strLine;
            }
            //Close the input stream
            in.close();
            //System.out.println(workflowXml);


            //while(!inputFile.getFileInfo().isFinished()){
            System.out.println(inputFile.getFileInfo().isFinished());
            //Thread.sleep(10000);
            //}


            //String workflowXML = IOUtils.toString(getClass().getResource("../workflows/" + fileInfo.getFileName()).openStream());
            Long workflowID = tavernaRESTClient.addWorkflow(workflowXml);
            System.out.println("WorkflowId :" + workflowID);
            workflowId.setValue("Workflow uploaded. ID: " + workflowID);

            showWorkflows();

        } catch (Exception e) {
            System.out.println(e);
        }

    }
}

